iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0

What is i18n?

i18nInternationalization的縮許,取概要和結尾文字,算一下字母數字18,組合就是一下i18n,這是一個約定俗成的叫法。 ,取概要和總結,字母算一下字母數18,組合一下就是i18n,這是一個約定俗成的叫法。在其他語言中,做國際化的相關包一般也會以這個名字命名。

國際化最重要的一點就是locale 地區資訊,Locale可由一個語言編碥(Language code)與可選的區域編碼(Country code)來指定,其中語言編碼是 ISO-639 定義,由兩個小寫字母代表,例如"ca"表示嘉泰羅尼亞文(Catalan),"zh"表示中文(Chinese)。區域編碼則由兩個大寫字母表示,定義 在ISO-3166, 例如IT表示義大利(Italy)、TW表示台灣(Taiwan)。

locale判定方式

  1. 根據子網域名的來源判定,像是123.com.tw的tw就是來自台灣
  2. 根據用戶IP位置判定
  3. 根據用戶在database資訊或是cookies中保存的訊息判定
  4. 根據用戶客戶端的瀏覽器設定判定
  5. 根據用戶Request中的parameters判定

gogf

為了使開發的軟件能夠國際化,需要做各種語言的適配,但不可能對不同的語言進行不同的頁面特性開發。因此我們需要對文字的部分進行處理,常見的方法就是,建立不同的語言的文件,他們記錄了一些詞在不同語言下的翻譯,通過關鍵詞來完成對應。當要使用的時候,通過調用不同語言文件裡的索引就可以引用出來。

我這裡用的是 https://github.com/gogf/gf 底下的i18n包

go get -u [github.com/gogf/gf](https://github.com/gogf/gf)

Gin with gogf

Step1

安裝過後,在根目錄建立一個i18n的文件夾,並新建兩個不同語言的文件。

en.toml

Response_Success="Success"
Response_Failed="Failed"

zh.toml

Response_Success="成功"
Response_Failed="失敗"

Step2

接下來我們將gi18n.New()與相關code放進POST /v1/users API試試

/app/controller/user.go

// CreateUser @Summary
// @Tags user
// @version 1.0
// @produce application/json
// @param language header string true "language"
// @param register body Register true "register"
// @Success 200 string successful return value
// @Router /v1/users [post]
func (u UsersController) CreateUser(c *gin.Context) {
	t := gi18n.New()
	var form Register
	bindErr := c.BindJSON(&form)

	lan := c.Request.Header.Get("language")
	if lan == "" {
		lan = "en"
	}
	t.SetLanguage(lan)
	if bindErr == nil {
		err := service.RegisterOneUser(form.Account, form.Password, form.Email)
		if err == nil {
			c.JSON(http.StatusOK, gin.H{
				"status": 1,
				"msg":    t.Translate(c, "Response_Success"),
				"data":   nil,
			})
		} else {
			c.JSON(http.StatusInternalServerError, gin.H{
				"status": -1,
				"msg":    "Register Failed" + err.Error(),
				"data":   nil,
			})
		}
	} else {
		c.JSON(http.StatusBadRequest, gin.H{
			"status": -1,
			"msg":    "Failed to parse register data" + bindErr.Error(),
			"data":   nil,
		})
	}
}

gi18n會去跟目錄底下找尋i18n資料夾,之後我們就可以透過t.SetLanguage()的function去找尋相關的語系並帶入其中的變數。

當參數為zh時,結果就是

{
  "data": null,
  "msg": "成功",
  "status": 1
}

當參數為en時,結果就是

{
  "data": null,
  "msg": "Success",
  "status": 1
}

Summary

雖說大部分的網站都是將i18n做在前端,但還是會有後端的API直接開放給外界使用的時候,所以i18n相關技術還是必須了解一下!

相關程式碼依樣會放在下方連結提供參考

https://github.com/Neskem/Ironman-2021/tree/Day-23


上一篇
Day22 Gin with CORS
下一篇
Day24 Gin with Cache
系列文
fmt.Println("從零開始的Golang生活")30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言